Add gtk_entry_set_alignment() to allow right-aligned entries and a
authorOwen Taylor <otaylor@redhat.com>
Mon, 1 Mar 2004 03:30:27 +0000 (03:30 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Mon, 1 Mar 2004 03:30:27 +0000 (03:30 +0000)
Sun Feb 29 22:01:49 2004  Owen Taylor  <otaylor@redhat.com>

        * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment()
        to allow right-aligned entries and a "xalign"
        property. (#59799, patch from Egon Andersen and
        Steffen Gutmann)

        * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
        xalign property description here too.

        * tests/testtext.c: UNDERLINE_ERROR test addition
        from Nicolas Settons' patch.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gtk/gtk-sections.txt
gtk/gtkentry.c
gtk/gtkentry.h
gtk/gtkmisc.c
tests/testtext.c

index 4e73b4271e4b3b96987dc8e7fa12ecfc0c10fa36..cb3fc0430e910ff1405d4d2ad89faa8bea2aaaa0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment() 
+       to allow right-aligned entries and a "xalign" 
+       property. (#59799, patch from Egon Andersen and 
+       Steffen Gutmann)
+
+       * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+       xalign property description here too.
+
+       * tests/testtext.c: UNDERLINE_ERROR test addition
+       from Nicolas Settons' patch.
+
 Sun Feb 29 20:34:06 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
index 4e73b4271e4b3b96987dc8e7fa12ecfc0c10fa36..cb3fc0430e910ff1405d4d2ad89faa8bea2aaaa0 100644 (file)
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment() 
+       to allow right-aligned entries and a "xalign" 
+       property. (#59799, patch from Egon Andersen and 
+       Steffen Gutmann)
+
+       * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+       xalign property description here too.
+
+       * tests/testtext.c: UNDERLINE_ERROR test addition
+       from Nicolas Settons' patch.
+
 Sun Feb 29 20:34:06 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
index 4e73b4271e4b3b96987dc8e7fa12ecfc0c10fa36..cb3fc0430e910ff1405d4d2ad89faa8bea2aaaa0 100644 (file)
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment() 
+       to allow right-aligned entries and a "xalign" 
+       property. (#59799, patch from Egon Andersen and 
+       Steffen Gutmann)
+
+       * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+       xalign property description here too.
+
+       * tests/testtext.c: UNDERLINE_ERROR test addition
+       from Nicolas Settons' patch.
+
 Sun Feb 29 20:34:06 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
index 4e73b4271e4b3b96987dc8e7fa12ecfc0c10fa36..cb3fc0430e910ff1405d4d2ad89faa8bea2aaaa0 100644 (file)
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment() 
+       to allow right-aligned entries and a "xalign" 
+       property. (#59799, patch from Egon Andersen and 
+       Steffen Gutmann)
+
+       * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+       xalign property description here too.
+
+       * tests/testtext.c: UNDERLINE_ERROR test addition
+       from Nicolas Settons' patch.
+
 Sun Feb 29 20:34:06 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
index 4e73b4271e4b3b96987dc8e7fa12ecfc0c10fa36..cb3fc0430e910ff1405d4d2ad89faa8bea2aaaa0 100644 (file)
@@ -1,3 +1,16 @@
+Sun Feb 29 22:01:49 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkentry.[ch]: Add gtk_entry_set_alignment() 
+       to allow right-aligned entries and a "xalign" 
+       property. (#59799, patch from Egon Andersen and 
+       Steffen Gutmann)
+
+       * gtk/gtkmisc.c (gtk_misc_class_init): Use improved
+       xalign property description here too.
+
+       * tests/testtext.c: UNDERLINE_ERROR test addition
+       from Nicolas Settons' patch.
+
 Sun Feb 29 20:34:06 2004  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwindow.[ch] gtk/gtkmenushellx.c: export
index 759a6df05a68d271a1f21a897c957ade96fc44a8..623ba6fcebeda88f22550c3279ddb1f090eab85c 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 29 22:04:43 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtk-sections.txt: Add gtk_entry_get_alignment
+
+Sun Feb 29 20:32:18 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtk-sections.txt: Add gtk_window_mnemonic_activate
+
 Sat Feb 28 01:14:23 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/migrating-GtkComboBox.sgml: New chapter.
index 55932c04095d18b22547a2a7ac7c3a4463ef1a54..597620d8b15b347a18187ec0c60779d496c6abb6 100644 (file)
@@ -1006,6 +1006,8 @@ gtk_entry_set_activates_default
 gtk_entry_set_has_frame
 gtk_entry_set_width_chars
 gtk_entry_get_invisible_char
+gtk_entry_set_alignment
+gtk_entry_get_alignment
 gtk_entry_get_layout
 gtk_entry_get_layout_offsets
 gtk_entry_get_max_length
index dbdbaf86dd47aacc1ca3b050cf1e06c2bfc5be9d..e9cf61144e04c47b027be8b1af1f4830c69d0c52 100644 (file)
 /* Maximum size of text buffer, in bytes */
 #define MAX_SIZE G_MAXUSHORT
 
+typedef struct _GtkEntryPrivate GtkEntryPrivate;
+
+#define GTK_ENTRY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ENTRY, GtkEntryPrivate))
+
+struct _GtkEntryPrivate 
+{
+  gfloat xalign;
+};
+
 enum {
   ACTIVATE,
   POPULATE_POPUP,
@@ -90,7 +99,8 @@ enum {
   PROP_ACTIVATES_DEFAULT,
   PROP_WIDTH_CHARS,
   PROP_SCROLL_OFFSET,
-  PROP_TEXT
+  PROP_TEXT,
+  PROP_XALIGN
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -535,6 +545,16 @@ gtk_entry_class_init (GtkEntryClass *class)
                                                        P_("The contents of the entry"),
                                                        "",
                                                        G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_XALIGN,
+                                   g_param_spec_float ("xalign",
+                                                      P_("X align"),
+                                                      P_("The horizontal alignment, from 0 (left) to 1 (right). Reversed for RTL layouts"),
+                                                      0.0,
+                                                      1.0,
+                                                      0.0,
+                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
   
   signals[POPULATE_POPUP] =
     g_signal_new ("populate_popup",
@@ -767,6 +787,8 @@ gtk_entry_class_init (GtkEntryClass *class)
                                                       P_("Whether to select the contents of an entry when it is focused"),
                                                       TRUE,
                                                       G_PARAM_READWRITE));
+
+  g_type_class_add_private (gobject_class, sizeof (GtkEntryPrivate));
 }
 
 static void
@@ -842,6 +864,10 @@ gtk_entry_set_property (GObject         *object,
       gtk_entry_set_text (entry, g_value_get_string (value));
       break;
 
+    case PROP_XALIGN:
+      gtk_entry_set_alignment (entry, g_value_get_float (value));
+      break;
+
     case PROP_SCROLL_OFFSET:
     case PROP_CURSOR_POSITION:
     default:
@@ -893,6 +919,9 @@ gtk_entry_get_property (GObject         *object,
     case PROP_TEXT:
       g_value_set_string (value, gtk_entry_get_text (entry));
       break;
+    case PROP_XALIGN:
+      g_value_set_float (value, gtk_entry_get_alignment (entry));
+      break;
       
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -903,6 +932,8 @@ gtk_entry_get_property (GObject         *object,
 static void
 gtk_entry_init (GtkEntry *entry)
 {
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+  
   GTK_WIDGET_SET_FLAGS (entry, GTK_CAN_FOCUS);
 
   entry->text_size = MIN_SIZE;
@@ -917,6 +948,7 @@ gtk_entry_init (GtkEntry *entry)
   entry->is_cell_renderer = FALSE;
   entry->editing_canceled = FALSE;
   entry->has_frame = TRUE;
+  priv->xalign = 0.0;
 
   gtk_drag_dest_set (GTK_WIDGET (entry),
                      GTK_DEST_DEFAULT_HIGHLIGHT,
@@ -3016,10 +3048,12 @@ gtk_entry_get_cursor_locations (GtkEntry   *entry,
 static void
 gtk_entry_adjust_scroll (GtkEntry *entry)
 {
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
   gint min_offset, max_offset;
-  gint text_area_width;
+  gint text_area_width, text_width;
   gint strong_x, weak_x;
   gint strong_xoffset, weak_xoffset;
+  gfloat xalign;
   PangoLayout *layout;
   PangoLayoutLine *line;
   PangoRectangle logical_rect;
@@ -3038,14 +3072,21 @@ gtk_entry_adjust_scroll (GtkEntry *entry)
   /* Display as much text as we can */
 
   if (gtk_widget_get_direction (GTK_WIDGET (entry)) == GTK_TEXT_DIR_LTR)
+      xalign = priv->xalign;
+  else
+      xalign = 1.0 - priv->xalign;
+
+  text_width = PANGO_PIXELS(logical_rect.width);
+
+  if (text_width > text_area_width)
     {
       min_offset = 0;
-      max_offset = MAX (min_offset, logical_rect.width / PANGO_SCALE - text_area_width);
+      max_offset = text_width - text_area_width;
     }
   else
     {
-      max_offset = logical_rect.width / PANGO_SCALE - text_area_width;
-      min_offset = MIN (0, max_offset);
+      min_offset = (text_width - text_area_width) * xalign;
+      max_offset = min_offset;
     }
 
   entry->scroll_offset = CLAMP (entry->scroll_offset, min_offset, max_offset);
@@ -3942,6 +3983,61 @@ gtk_entry_get_layout_offsets (GtkEntry *entry,
     *y += text_area_y;
 }
 
+
+/**
+ * gtk_entry_set_alignment:
+ * @entry: a #GtkEntry
+ * @xalign: The horizontal alignment, from 0 (left) to 1 (right).
+ *          Reversed for RTL layouts
+ * 
+ * Sets the alignment for the contents of the entry. This controls
+ * the horizontal positioning of the contents when the displayed
+ * text is shorter than the width of the entry.
+ **/
+void
+gtk_entry_set_alignment (GtkEntry *entry, gfloat xalign)
+{
+  GtkEntryPrivate *priv;
+  
+  g_return_if_fail (GTK_IS_ENTRY (entry));
+
+  priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+  if (xalign < 0.0)
+    xalign = 0.0;
+  else if (xalign > 1.0)
+    xalign = 1.0;
+
+  if (xalign != priv->xalign)
+    {
+      priv->xalign = xalign;
+
+      gtk_entry_recompute (entry);
+
+      g_object_notify (G_OBJECT (entry), "xalign");
+    }
+}
+
+/**
+ * gtk_entry_get_alignment:
+ * @entry: a #GtkEntry
+ * 
+ * Gets the value set by gtk_entry_set_alignment().
+ * 
+ * Return value: the alignment
+ **/
+gfloat
+gtk_entry_get_alignment (GtkEntry *entry)
+{
+  GtkEntryPrivate *priv;
+  
+  g_return_val_if_fail (GTK_IS_ENTRY (entry), 0.0);
+
+  priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+  return priv->xalign;
+}
+
 /* Quick hack of a popup menu
  */
 static void
index d7b2f25478150e62e7d7229b4714823f24d0b1a2..3c06f472dc751bd92a1c9694de5a7e1fe64281f4 100644 (file)
@@ -182,6 +182,9 @@ PangoLayout* gtk_entry_get_layout               (GtkEntry      *entry);
 void         gtk_entry_get_layout_offsets       (GtkEntry      *entry,
                                                  gint          *x,
                                                  gint          *y);
+void       gtk_entry_set_alignment              (GtkEntry      *entry,
+                                                 gfloat         xalign);
+gfloat     gtk_entry_get_alignment              (GtkEntry      *entry);
 
 void                gtk_entry_set_completion (GtkEntry           *entry,
                                               GtkEntryCompletion *completion);
index fd9ff5cad7f382b2608c209171afb73436769c89..20b1f64bbfa027fc86fb9fdf2e3efd80519b4e13 100644 (file)
@@ -96,7 +96,7 @@ gtk_misc_class_init (GtkMiscClass *class)
                                    PROP_XALIGN,
                                    g_param_spec_float ("xalign",
                                                       P_("X align"),
-                                                      P_("The horizontal alignment, from 0 (left) to 1 (right)"),
+                                                      P_("The horizontal alignment, from 0 (left) to 1 (right). Reversed for RTL layouts"),
                                                       0.0,
                                                       1.0,
                                                       0.5,
index 13eaabd42d95e7a95ac3c3ffe693d2e1a5c0d5ba..ef22c2b050ac3ff91145d6b59566282aaeae94a8 100644 (file)
@@ -502,10 +502,12 @@ fill_example_buffer (GtkTextBuffer *buffer)
                 "underline", PANGO_UNDERLINE_SINGLE,
                 NULL);
 
+  tag = gtk_text_buffer_create_tag (buffer, "underline_error", NULL);
+
   setup_tag (tag);
       
   g_object_set (tag,
-                "underline", PANGO_UNDERLINE_SINGLE,
+                "underline", PANGO_UNDERLINE_ERROR,
                 NULL);
 
   tag = gtk_text_buffer_create_tag (buffer, "centered", NULL);
@@ -580,6 +582,11 @@ fill_example_buffer (GtkTextBuffer *buffer)
 
       gtk_text_buffer_apply_tag_by_name (buffer, "underline", &iter, &iter2);
 
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 4);
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 7);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "underline_error", &iter, &iter2);
+
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 14);
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 24);